// Websocket地址
const url = "ws://localhost:8081/api/ws";

// Websocket实例
let ws = null;

// 重连定时器实例
let reconnectTimer = null;

// 当前用户id
let currentUserId = null;

// websocket重连开关
let isReconnecting = false;

// websocket对象
const websocket = {
  // websocket建立连接
  Init(userId) {
    if (!userId) {
      console.log("WebSocket初始化失败：缺少userId");
      return;
    }

    // 保存当先用户ID，用于模块化初始化数据，切刷新时数据不改变，放入sessionStorage中
    currentUserId = userId;
    // setSessionStorage("ws_userId",userId)
    // 判断浏览器是否支持websocket
    if (!("WebSocket" in window)) {
      console.log("浏览器是否支持websocket", window.WebSocket);
      return;
    }
    // 如果已有连接则先关闭
    if (ws && ws.readyState === WebSocket.CLOSED) {
      this.Close();
    }

    //创建websocket实例
    ws = new WebSocket(`${url}/${userId}`);
    // ws = new WebSocket(url);
    //创建websocket连接成功事件
    ws.onopen = function () {
      console.log("连接成功");
      // 断线重连成功，将断线重连开关设置为false
      isReconnecting = false;
      // 清除所有待处理的重连定时器
      clearTimeout(reconnectTimer);
      reconnectTimer = null;
    };
    // 监听WebSocket连接错误信息
    ws.onerror = (e) => {
      console.log("WebSocket数据传输发生错误", e);
      // 如果不是主动断开连接，则尝试重连
      if (!isReconnecting && currnetUserId) {
        this.reconnect();
      }
    };

    // 监听WebSocket接收消息
    ws.onmessage = (e) => {
      // 心跳消息不做处理
      if (e.data === "ok") {
        return;
      }
      console.log("WebSocket接收消息:", e.data);

      // 调用回调函数处理接收到的消息
      if (this.onMessageCallback) {
        this.onMessageCallback(e.data);
      }
    };
    // 连接关闭处理
    ws.onclose = (e) => {
      console.log("WebSocket连接关闭:", e);
      // 如果不是主动断开连接，则尝试重连
      if (!isReconnecting && currentUserId) {
        this.reconnect();
      }
    };
  },

  //websocket连接关闭方法
  Close() {
    // 关闭断开重连机制
    isReconnecting = true;
    currentUserId = null;
    if (ws) {
      ws.close();
    }
    clearTimeout(reconnectTimer);
    reconnectTimer = null;
    console.log("websocket连接已关闭");
  },

  //websocket发送消息方法
  Send(data) {
    if (!ws || ws.readyState !== Websocket.OPEN) {
      console.log("无法发送消息：websocket未连接");
      return;
    }
    try {
      // 处理发送数据JSON字符串
      const msg = JSON.stringify(data);
      // 发送消息给后端
      ws.send(msg);
    } catch (error) {
      console.log("发送消息失败：", error);
    }
  },

  //暴露websocket实例，其他地方调用这个方法即可
  getWebSocket() {
    return ws;
  },

  //新增回调函数用于处理收到的消息
  onMessageCallback: null,

  // 设置消息处理回调函数
  setMessageCallback(callback) {
    this.onMessageCallback = callback;
  },

  // 重连方法
  reconnect() {
    if (!currentUserId) {
      console.log("用户未登录，无法重连");
      return;
    }
    if (isReconnecting) return;
    isReconnecting = true;
    console.log("WebSocket开始重连...");
    // 清除现有定时器
    clearTimeout(reconnectTimer);

    reconnectTimer = setTimeout(() => {
      console.log("WebSocket正在重连...");
      this.Init(currentUserId);
      //5秒后重置重连标志，允许下次重连
      setTimeout(() => {
        isReconnecting = false;
      }, 5000);
    }, 5000);
  },
};

// 监听窗口关闭事件，当窗口关闭时-每一个页面关闭都会触发-扩张需求业务
window.addEventListener("beforeunload", () => {
  websocket.Close();
  // sessionStorage.removeItem("ws_userId");
  console.log("页面关闭");
});

// 浏览器刷新从新连接
// 刷新页面后需要重新连-并且是在登录后
if (performance.getEntriesByType("navigation")[0].type === "reload") {
  console.log("WebSocket浏览器刷新了");
  // 从sessionStorage获取缓存的userId
  const cachedUserId = sessionStorage.getItem("ws_userId");

  if (cachedUserId) {
    setTimeout(() => {
      console.log("websocket执行刷新重新连接...");
      websocket.Init(cachedUserId);
    }, 1000);
  }
}

//暴露对象
export default websocket;
